package vector

import (
	"fmt"
	"log"

	"mcp-server/internal/config"
	"mcp-server/internal/qdrant"
)

// VectorIntegration 向量化集成服务
type VectorIntegration struct {
	manager       *VectorManager
	qdrantService *qdrant.QdrantService
	config        *config.Config
	initialized   bool
}

// NewVectorIntegration 创建向量化集成服务
func NewVectorIntegration(qdrantService *qdrant.QdrantService, cfg *config.Config) *VectorIntegration {
	return &VectorIntegration{
		qdrantService: qdrantService,
		config:        cfg,
	}
}

// Initialize 初始化向量化集成服务
func (vi *VectorIntegration) Initialize() error {
	if vi.initialized {
		return nil
	}

	log.Println("正在初始化向量化集成服务...")

	// 获取Qdrant客户端
	qdrantClient := vi.qdrantService.GetClient()
	if qdrantClient == nil {
		return fmt.Errorf("Qdrant客户端未初始化")
	}

	// 创建向量管理器
	vi.manager = NewVectorManager(qdrantClient)

	// 配置向量管理器
	managerConfig := DefaultManagerConfig()
	if vi.config != nil && vi.config.Vector != nil {
		managerConfig.BatchSize = vi.config.Vector.BatchSize
		managerConfig.UpdateInterval = vi.config.Vector.AutoUpdateInterval
	}

	// 初始化向量管理器
	if err := vi.manager.Initialize(managerConfig); err != nil {
		return fmt.Errorf("初始化向量管理器失败: %v", err)
	}

	vi.initialized = true
	log.Println("向量化集成服务初始化完成")

	return nil
}

// Close 关闭向量化集成服务
func (vi *VectorIntegration) Close() error {
	if !vi.initialized {
		return nil
	}

	log.Println("正在关闭向量化集成服务...")

	if vi.manager != nil {
		if err := vi.manager.Close(); err != nil {
			log.Printf("关闭向量管理器时出错: %v", err)
		}
	}

	vi.initialized = false
	log.Println("向量化集成服务已关闭")

	return nil
}

// GetManager 获取向量管理器
func (vi *VectorIntegration) GetManager() *VectorManager {
	return vi.manager
}

// IsInitialized 检查是否已初始化
func (vi *VectorIntegration) IsInitialized() bool {
	return vi.initialized
}

// ProcessKnowledgeBase 处理知识库
func (vi *VectorIntegration) ProcessKnowledgeBase(kbPath string, fullUpdate bool) (*UpdateResult, error) {
	if !vi.initialized {
		return nil, fmt.Errorf("向量化集成服务未初始化")
	}

	if vi.manager == nil {
		return nil, fmt.Errorf("向量管理器未初始化")
	}

	log.Printf("开始处理知识库: %s (全量更新: %v)", kbPath, fullUpdate)

	// 处理目录中的所有文档
	result, err := vi.manager.ProcessAndStoreDirectory(kbPath, true)
	if err != nil {
		return nil, fmt.Errorf("处理知识库失败: %v", err)
	}

	log.Printf("知识库处理完成: 总文件 %d, 成功 %d, 失败 %d",
		result.TotalFiles, result.SuccessFiles, result.FailedFiles)

	return result, nil
}

// SearchSimilar 搜索相似文档
func (vi *VectorIntegration) SearchSimilar(query string, limit int) ([]qdrant.SearchResult, error) {
	if !vi.initialized {
		return nil, fmt.Errorf("向量化集成服务未初始化")
	}

	if vi.manager == nil {
		return nil, fmt.Errorf("向量管理器未初始化")
	}

	return vi.manager.SearchSimilar(query, limit)
}

// GetStatus 获取状态
func (vi *VectorIntegration) GetStatus() map[string]interface{} {
	status := make(map[string]interface{})
	status["initialized"] = vi.initialized

	if vi.manager != nil {
		status["manager"] = vi.manager.GetStatus()
	}

	return status
}
